package com.bdqn.controller;

import com.bdqn.pojo.Book;
import com.bdqn.service.BookService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * Hi控制器，接收用户请求并处理
 *
 * @author LILIBO
 * @since 2024/7/25
 */
@Controller
// @RequestMapping("/hi")
public class HiController {

    // 引入业务逻辑层
    @Resource
    private BookService bookService;

    /**
     * 请求路径 /hi1 将会访问该方法，通过 @RequestMapping("/hi1") 生效
     *
     * @return 视图名称
     */
    @RequestMapping("/hi1")
    public String hi1() {
        // 返回 "hello" 将会将 /WEB-INF/jsp/hello.jsp 视图返回给浏览器（使用SpringMVC视图解析器配置中的 前缀 + 视图名称 + 后缀 进行定位）
        return "hello";
    }

    /**
     * 请求路径 /hi2 将会访问该方法，通过 @RequestMapping("/hi2") 生效
     * <p>
     * method = RequestMethod.POST 只支持POST方式访问
     *
     * @return 视图名称
     */
    @RequestMapping(value = "/hi2", method = RequestMethod.POST)
    public String hi2() {
        // 返回 "hello" 将会将 /WEB-INF/jsp/hello.jsp 视图返回给浏览器（使用SpringMVC视图解析器配置中的 前缀 + 视图名称 + 后缀 进行定位）
        return "hello";
    }

    /**
     * 以POST方式请求路径 /hi3 将会访问该方法，通过 @PostMapping("/hi3") 生效
     * <p>
     * 与@RequestMapping(method = RequestMethod.POST)等效
     *
     * @return 视图名称
     */
    @PostMapping("/hi3")
    public String hi3() {
        // 返回 "hello" 将会将 /WEB-INF/jsp/hello.jsp 视图返回给浏览器（使用SpringMVC视图解析器配置中的 前缀 + 视图名称 + 后缀 进行定位）
        return "hello";
    }

    /**
     * 以GET方式请求路径 /hi4 将会访问该方法，通过 @GetMapping("/hi4") 生效
     * <p>
     * 与@RequestMapping(method = RequestMethod.GET)等效
     *
     * @return 视图名称
     */
    @GetMapping("/hi4")
    public String hi4() {
        // 返回 "hello" 将会将 /WEB-INF/jsp/hello.jsp 视图返回给浏览器（使用SpringMVC视图解析器配置中的 前缀 + 视图名称 + 后缀 进行定位）
        return "hello";
    }

    /**
     * 以POST方式请求路径 /hi5 将会访问该方法，通过 @PostMapping("/hi5") 生效
     * <p>
     * 使用 @RequestParam("name") 映射请求参数 name
     *
     * @return 视图名称
     */
    @PostMapping("/hi5")
    public String hi5(Model model, HttpServletRequest request, @RequestParam("name") String realName) {
        System.out.println("接收到页面请求的参数：realName=" + realName);
        String name = request.getParameter("name");
        System.out.println("通过Request获取请求的参数：name=" + realName);

        // 调用Service层的业务逻辑
        List<Book> list = bookService.list();

        // 将数据设置到作用域，model相当于Page作用域
        model.addAttribute("resName", realName);
        model.addAttribute("listSize", list.size());

        // 返回 "hello" 将会将 /WEB-INF/jsp/hello.jsp 视图返回给浏览器（使用SpringMVC视图解析器配置中的 前缀 + 视图名称 + 后缀 进行定位）
        return "hello";
    }

    /**
     * 以POST方式请求路径 /hi6 将会访问该方法，返回ModelAndView模型视图对象
     * <p>
     * 使用 modelAndView.addObject("resName", realName); 将变量realName设置到page作用域，key为resName
     * 使用 modelAndView.setViewName("hello"); 设置视图名称
     *
     * @return 视图名称
     */
    @PostMapping("/hi6")
    public ModelAndView hi6(ModelAndView modelAndView, @RequestParam("name") String realName) {
        System.out.println("接收到页面请求的参数：realName=" + realName);

        // 将数据设置到作用域，model相当于Page作用域
        modelAndView.addObject("resName", realName);

        // 设置视图名称
        modelAndView.setViewName("hello");

        // 返回 "hello" 将会将 /WEB-INF/jsp/hello.jsp 视图返回给浏览器（使用SpringMVC视图解析器配置中的 前缀 + 视图名称 + 后缀 进行定位）
        return modelAndView;
    }

    /**
     * 以POST方式请求路径 /hi7/1/abc 将会访问该方法，通过 @PathVariable("id") 生效
     * <p>
     * 使用 @PathVariable("id") 映射路径参数 id 到 int id
     * 使用 @PathVariable("name") 映射路径参数 id 到 String name
     *
     * @return 视图名称
     */
    @PostMapping("/hi7/{id}/{name}") // /hi7/3/li
    public String hi7(Model model, @PathVariable("id") int id, @PathVariable("name") String realName) {
        System.out.println("接收到页面请求的参数：id=" + id);
        System.out.println("接收到页面请求的参数：realName=" + realName);

        // 将数据设置到作用域，model相当于Page作用域
        model.addAttribute("id", id);
        model.addAttribute("resName", realName);

        // 返回 "hello" 将会将 /WEB-INF/jsp/hello.jsp 视图返回给浏览器（使用SpringMVC视图解析器配置中的 前缀 + 视图名称 + 后缀 进行定位）
        return "hello";
    }

    /**
     * 以POST方式请求路径 /hi8 将会访问该方法，通过 @PostMapping("/hi8") 生效
     * <p>
     * 使用 @RequestBody String body 将body数据映射请求参数 body 通常为json格式
     *
     * @return 视图名称
     */
    @PostMapping("/hi8")
    public String hi8(Model model, @RequestBody String body) {
        System.out.println("接收到页面请求的参数：\n" + body);

        return "hello";
    }

}
